AsyncLayoutInflater
AsyncLayoutInflater
AsyncLayoutInflater 用于异步布局加载
AsyncLayoutInflater 使用
class AsyncLayoutInflaterActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val pb = ProgressBar(this)
setContentView(pb)
val s = System.currentTimeMillis()
thread {
LogUtils.logi("inflate", "thread.sleep", "模拟耗时的inflate。。。")
SystemClock.sleep(2000)
runOnUiThread {
// AsyncLayoutInflater不能直接在非UI线程使用
AsyncLayoutInflater(this@AsyncLayoutInflaterActivity)
.inflate(R.layout.activity_async_inflater_demo, null) { view, resid, parent ->
setContentView(view)
LogUtils.logi("inflate", "onInflateFinished", "耗时${System.currentTimeMillis() - s}ms")
}
}
}
}
}
AsyncLayoutInflater 不足
- 异步转换出来的 View 并没有被加到 parent view 中,必须手动添加
- 缓存队列默认 10 的大小限制如果超过了 10 个则会导致主线程的等待
- AsyncLayoutInflater 不支持设置 LayoutInflater.Factory 或者 LayoutInflater.Factory2
- 不能在非主线程中调用 AsyncLayoutInflater,因为异步线程默认没有调用 Looper.prepare()
- 如果在异步加载 view 还没有添加到 parent 时,做一些 View 操作或者依赖 context 的操作,容易出问题,mashi 项目就出现大量这样的问题